🎖️GitЯра🎖️
Node / meshtastic / Meshtastic-Android / files / feature / messaging / src / commonMain / kotlin / org / meshtastic / feature / messaging / MessageViewModel.kt
Displaying Raw • Download
feature/messaging/src/commonMain/kotlin/org/meshtastic/feature/messaging/MessageViewModel.kt 1390a3cd4f7bc55a37433d1d868e65c01678eb31 (1390a3cd) Text, 10.16 KB
T8b949e/*
* Copyright (c) 2025-2026 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
Tff7b72package T7ee787org.meshtastic.feature.messaging
Tff7b72import T7ee787androidx.lifecycle.SavedStateHandle
Tff7b72import T7ee787androidx.lifecycle.ViewModel
Tff7b72import T7ee787androidx.lifecycle.viewModelScope
Tff7b72import T7ee787androidx.paging.PagingData
Tff7b72import T7ee787androidx.paging.cachedIn
Tff7b72import T7ee787kotlinx.coroutines.flow.Flow
Tff7b72import T7ee787kotlinx.coroutines.flow.MutableStateFlow
Tff7b72import T7ee787kotlinx.coroutines.flow.StateFlow
Tff7b72import T7ee787kotlinx.coroutines.flow.asStateFlow
Tff7b72import T7ee787kotlinx.coroutines.flow.combine
Tff7b72import T7ee787kotlinx.coroutines.flow.emitAll
Tff7b72import T7ee787kotlinx.coroutines.flow.filterNotNull
Tff7b72import T7ee787kotlinx.coroutines.flow.flatMapLatest
Tff7b72import T7ee787kotlinx.coroutines.flow.flow
Tff7b72import T7ee787kotlinx.coroutines.flow.update
Tff7b72import T7ee787kotlinx.coroutines.launch
Tff7b72import T7ee787org.koin.core.annotation.KoinViewModel
Tff7b72import T7ee787org.meshtastic.core.common.util.ioDispatcher
Tff7b72import T7ee787org.meshtastic.core.model.ContactSettings
Tff7b72import T7ee787org.meshtastic.core.model.DataPacket
Tff7b72import T7ee787org.meshtastic.core.model.Message
Tff7b72import T7ee787org.meshtastic.core.model.Node
Tff7b72import T7ee787org.meshtastic.core.model.service.ServiceAction
Tff7b72import T7ee787org.meshtastic.core.repository.CustomEmojiPrefs
Tff7b72import T7ee787org.meshtastic.core.repository.HomoglyphPrefs
Tff7b72import T7ee787org.meshtastic.core.repository.NodeRepository
Tff7b72import T7ee787org.meshtastic.core.repository.NotificationManager
Tff7b72import T7ee787org.meshtastic.core.repository.PacketRepository
Tff7b72import T7ee787org.meshtastic.core.repository.QuickChatActionRepository
Tff7b72import T7ee787org.meshtastic.core.repository.RadioConfigRepository
Tff7b72import T7ee787org.meshtastic.core.repository.ServiceRepository
Tff7b72import T7ee787org.meshtastic.core.repository.UiPrefs
Tff7b72import T7ee787org.meshtastic.core.repository.usecase.SendMessageUseCase
Tff7b72import T7ee787org.meshtastic.core.ui.viewmodel.stateInWhileSubscribed
Tff7b72import T7ee787org.meshtastic.proto.ChannelSet
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffLongParameterListTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffTooManyFunctionsTa5d6ff"Tb4b4b4)
Tf0883e@KoinViewModel
Tff7b72class T56d364MessageViewModelTb4b4b4(
Te6edf3savedStateHandleTb4b4b4: Te6edf3SavedStateHandleTb4b4b4,
Tff7b72private Tff7b72val Te6edf3nodeRepositoryTb4b4b4: Te6edf3NodeRepositoryTb4b4b4,
Te6edf3radioConfigRepositoryTb4b4b4: Te6edf3RadioConfigRepositoryTb4b4b4,
Te6edf3quickChatActionRepositoryTb4b4b4: Te6edf3QuickChatActionRepositoryTb4b4b4,
Tff7b72private Tff7b72val Te6edf3serviceRepositoryTb4b4b4: Te6edf3ServiceRepositoryTb4b4b4,
Tff7b72private Tff7b72val Te6edf3packetRepositoryTb4b4b4: Te6edf3PacketRepositoryTb4b4b4,
Tff7b72private Tff7b72val Te6edf3uiPrefsTb4b4b4: Te6edf3UiPrefsTb4b4b4,
Tff7b72private Tff7b72val Te6edf3customEmojiPrefsTb4b4b4: Te6edf3CustomEmojiPrefsTb4b4b4,
Tff7b72private Tff7b72val Te6edf3homoglyphEncodingPrefsTb4b4b4: Te6edf3HomoglyphPrefsTb4b4b4,
Tff7b72private Tff7b72val Te6edf3notificationManagerTb4b4b4: Te6edf3NotificationManagerTb4b4b4,
Tff7b72private Tff7b72val Te6edf3sendMessageUseCaseTb4b4b4: Te6edf3SendMessageUseCaseTb4b4b4,
Tb4b4b4) Tb4b4b4: Te6edf3ViewModelTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72private Tff7b72val Te6edf3_title Tff7b72= Te6edf3MutableStateFlowTb4b4b4(Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tff7b72val Te6edf3titleTb4b4b4: Te6edf3StateFlowTff7b72<Tffa657StringTff7b72> Tff7b72= Te6edf3_titleTb4b4b4.Te6edf3asStateFlowTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3ourNodeInfo Tff7b72= Te6edf3nodeRepositoryTb4b4b4.Te6edf3ourNodeInfo
Tff7b72val Te6edf3connectionState Tff7b72= Te6edf3serviceRepositoryTb4b4b4.Te6edf3connectionState
Tff7b72val Te6edf3nodeListTb4b4b4: Te6edf3StateFlowTff7b72<Te6edf3ListTff7b72<Te6edf3NodeTff7b72>Tff7b72> Tff7b72= Te6edf3nodeRepositoryTb4b4b4.Te6edf3getNodesTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3stateInWhileSubscribedTb4b4b4(Te6edf3initialValue Tff7b72= Te6edf3emptyListTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72val Te6edf3channels Tff7b72= Te6edf3radioConfigRepositoryTb4b4b4.Te6edf3channelSetFlowTb4b4b4.Te6edf3stateInWhileSubscribedTb4b4b4(Te6edf3ChannelSetTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72val Te6edf3showQuickChat Tff7b72= Te6edf3uiPrefsTb4b4b4.Te6edf3showQuickChat
Tff7b72private Tff7b72val Te6edf3_showFiltered Tff7b72= Te6edf3MutableStateFlowTb4b4b4(Tff7b72falseTb4b4b4)
Tff7b72val Te6edf3showFilteredTb4b4b4: Te6edf3StateFlowTff7b72<Tffa657BooleanTff7b72> Tff7b72= Te6edf3_showFilteredTb4b4b4.Te6edf3asStateFlowTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3quickChatActions Tff7b72= Te6edf3quickChatActionRepositoryTb4b4b4.Te6edf3getAllActionsTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3stateInWhileSubscribedTb4b4b4(Te6edf3initialValue Tff7b72= Te6edf3emptyListTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72val Te6edf3contactSettingsTb4b4b4: Te6edf3StateFlowTff7b72<Te6edf3MapTff7b72<Tffa657StringTb4b4b4, Te6edf3ContactSettingsTff7b72>Tff7b72> Tff7b72=
Te6edf3packetRepositoryTb4b4b4.Te6edf3getContactSettingsTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3stateInWhileSubscribedTb4b4b4(Te6edf3initialValue Tff7b72= Te6edf3emptyMapTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72private Tff7b72val Te6edf3contactKeyForPagedMessagesTb4b4b4: Te6edf3MutableStateFlowTff7b72<Tffa657String?Tff7b72> Tff7b72= Te6edf3MutableStateFlowTb4b4b4(Tff7b72nullTb4b4b4)
Tff7b72private Tff7b72val Te6edf3pagedMessagesForContactKeyTb4b4b4: Te6edf3FlowTff7b72<Te6edf3PagingDataTff7b72<Te6edf3MessageTff7b72>Tff7b72> Tff7b72=
Te6edf3combineTb4b4b4(Te6edf3contactKeyForPagedMessagesTb4b4b4.Te6edf3filterNotNullTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3_showFilteredTb4b4b4, Te6edf3contactSettingsTb4b4b4) Tb4b4b4{
Te6edf3contactKeyTb4b4b4,
Te6edf3showFilteredTb4b4b4,
Te6edf3settingsTb4b4b4,
Tff7b72-Tff7b72>
T8b949e// If filtering is disabled for this contact, always include filtered messages
Tff7b72val Te6edf3filteringDisabled Tff7b72= Te6edf3settingsTff7b72[Te6edf3contactKeyTff7b72]Tff7b72?.Te6edf3filteringDisabled Tff7b72?: Tff7b72false
Tff7b72val Te6edf3includeFiltered Tff7b72= Te6edf3showFiltered Tff7b72|Tff7b72| Te6edf3filteringDisabled
Te6edf3contactKey Te6edf3to Te6edf3includeFiltered
Tb4b4b4}
Tb4b4b4.Te6edf3flatMapLatest Tb4b4b4{ Tb4b4b4(Te6edf3contactKeyTb4b4b4, Te6edf3includeFilteredTb4b4b4) Tff7b72-Tff7b72>
Te6edf3packetRepositoryTb4b4b4.Te6edf3getMessagesFromPagedTb4b4b4(Te6edf3contactKeyTb4b4b4, Te6edf3includeFilteredTb4b4b4, Tff7b72::Te6edf3getNodeTb4b4b4)
Tb4b4b4}
Tb4b4b4.Te6edf3cachedInTb4b4b4(Te6edf3viewModelScopeTb4b4b4)
Tff7b72val Te6edf3frequentEmojisTb4b4b4: Te6edf3ListTff7b72<Tffa657StringTff7b72>
Tff7b72getTb4b4b4(Tb4b4b4) Tff7b72=
Te6edf3customEmojiPrefsTb4b4b4.Te6edf3customEmojiFrequencyTb4b4b4.Te6edf3value
Tff7b72?.Te6edf3splitTb4b4b4(Ta5d6ff"Ta5d6ff,Ta5d6ff"Tb4b4b4)
Tff7b72?.Te6edf3associate Tb4b4b4{ Te6edf3entry Tff7b72-Tff7b72>
Te6edf3entryTb4b4b4.Te6edf3splitTb4b4b4(Ta5d6ff"Ta5d6ff=Ta5d6ff"Tb4b4b4, Te6edf3limit Tff7b72= T79c0ff2Tb4b4b4)Tb4b4b4.Te6edf3takeIf Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3size Tff7b72=Tff7b72= T79c0ff2 Tb4b4b4}Tff7b72?.Te6edf3let Tb4b4b4{ Tffa657itTff7b72[T79c0ff0Tff7b72] Te6edf3to Tffa657itTff7b72[T79c0ff1Tff7b72]Tb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4) Tb4b4b4} Tff7b72?: Tb4b4b4(Ta5d6ff"Ta5d6ff" Te6edf3to T79c0ff0Tb4b4b4)
Tb4b4b4}
Tff7b72?.Te6edf3toListTb4b4b4(Tb4b4b4)
Tff7b72?.Te6edf3sortedByDescending Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3second Tb4b4b4}
Tff7b72?.Te6edf3map Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3first Tb4b4b4}
Tff7b72?.Te6edf3takeTb4b4b4(T79c0ff6Tb4b4b4) Tff7b72?: Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6ff👍Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff👎Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff😂Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff🔥Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff❤️Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff😮Ta5d6ff"Tb4b4b4)
Tff7b72val Te6edf3homoglyphEncodingEnabled Tff7b72= Te6edf3homoglyphEncodingPrefsTb4b4b4.Te6edf3homoglyphEncodingEnabled
Tff7b72val Te6edf3firstUnreadMessageUuidTb4b4b4: Te6edf3StateFlowTff7b72<Tffa657Long?Tff7b72> Tff7b72=
Te6edf3contactKeyForPagedMessages
Tb4b4b4.Te6edf3filterNotNullTb4b4b4(Tb4b4b4)
Tb4b4b4.Te6edf3flatMapLatest Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3getFirstUnreadMessageUuidTb4b4b4(Tffa657itTb4b4b4) Tb4b4b4}
Tb4b4b4.Te6edf3stateInWhileSubscribedTb4b4b4(Tff7b72nullTb4b4b4)
Tff7b72val Te6edf3hasUnreadMessagesTb4b4b4: Te6edf3StateFlowTff7b72<Tffa657Boolean?Tff7b72> Tff7b72=
Te6edf3contactKeyForPagedMessages
Tb4b4b4.Te6edf3filterNotNullTb4b4b4(Tb4b4b4)
Tb4b4b4.Te6edf3flatMapLatest Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3hasUnreadMessagesTb4b4b4(Tffa657itTb4b4b4) Tb4b4b4}
Tb4b4b4.Te6edf3stateInWhileSubscribedTb4b4b4(Tff7b72nullTb4b4b4)
Tff7b72val Te6edf3unreadCountTb4b4b4: Te6edf3StateFlowTff7b72<Tffa657IntTff7b72> Tff7b72=
Te6edf3contactKeyForPagedMessages
Tb4b4b4.Te6edf3filterNotNullTb4b4b4(Tb4b4b4)
Tb4b4b4.Te6edf3flatMapLatest Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3getUnreadCountFlowTb4b4b4(Tffa657itTb4b4b4) Tb4b4b4}
Tb4b4b4.Te6edf3stateInWhileSubscribedTb4b4b4(T79c0ff0Tb4b4b4)
Tff7b72val Te6edf3filteredCountTb4b4b4: Te6edf3StateFlowTff7b72<Tffa657IntTff7b72> Tff7b72=
Te6edf3contactKeyForPagedMessages
Tb4b4b4.Te6edf3filterNotNullTb4b4b4(Tb4b4b4)
Tb4b4b4.Te6edf3flatMapLatest Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3getFilteredCountFlowTb4b4b4(Tffa657itTb4b4b4) Tb4b4b4}
Tb4b4b4.Te6edf3stateInWhileSubscribedTb4b4b4(T79c0ff0Tb4b4b4)
Tff7b72init Tb4b4b4{
Tff7b72val Te6edf3contactKey Tff7b72= Te6edf3savedStateHandleTb4b4b4.Te6edf3getTff7b72<Tffa657StringTff7b72>Tb4b4b4(Ta5d6ff"Ta5d6ffcontactKeyTa5d6ff"Tb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3contactKey Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3contactKeyForPagedMessagesTb4b4b4.Te6edf3value Tff7b72= Te6edf3contactKey
Tb4b4b4}
Tb4b4b4}
Tff7b72fun Td2a8ffsetContactKeyTb4b4b4(Te6edf3contactKeyTb4b4b4: Tffa657StringTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3contactKeyForPagedMessagesTb4b4b4.Te6edf3value Tff7b72!Tff7b72= Te6edf3contactKeyTb4b4b4) Tb4b4b4{
Te6edf3contactKeyForPagedMessagesTb4b4b4.Te6edf3value Tff7b72= Te6edf3contactKey
Tb4b4b4}
Tb4b4b4}
Tff7b72fun Td2a8ffsetTitleTb4b4b4(Te6edf3titleTb4b4b4: Tffa657StringTb4b4b4) Tb4b4b4{
Te6edf3viewModelScopeTb4b4b4.Te6edf3launch Tb4b4b4{ Te6edf3_titleTb4b4b4.Te6edf3value Tff7b72= Te6edf3title Tb4b4b4}
Tb4b4b4}
Tff7b72fun Td2a8ffgetMessagesFromPagedTb4b4b4(Te6edf3contactKeyTb4b4b4: Tffa657StringTb4b4b4)Tb4b4b4: Te6edf3FlowTff7b72<Te6edf3PagingDataTff7b72<Te6edf3MessageTff7b72>Tff7b72> Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3contactKeyForPagedMessagesTb4b4b4.Te6edf3value Tff7b72!Tff7b72= Te6edf3contactKeyTb4b4b4) Tb4b4b4{
Te6edf3contactKeyForPagedMessagesTb4b4b4.Te6edf3value Tff7b72= Te6edf3contactKey
Tb4b4b4}
Tff7b72return Te6edf3pagedMessagesForContactKey
Tb4b4b4}
T8b949e/**
* Returns a non-paged reactive [Flow] of messages for a conversation. Used by desktop targets that don't use
* paging-compose.
*
* @param contactKey The unique contact key identifying the conversation.
* @param limit Optional maximum number of messages to return (null = all).
*/
Tff7b72fun Td2a8ffgetMessagesFlowTb4b4b4(Te6edf3contactKeyTb4b4b4: Tffa657StringTb4b4b4, Te6edf3limitTb4b4b4: Tffa657Int? Tff7b72= Tff7b72nullTb4b4b4)Tb4b4b4: Te6edf3FlowTff7b72<Te6edf3ListTff7b72<Te6edf3MessageTff7b72>Tff7b72> Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3contactKeyForPagedMessagesTb4b4b4.Te6edf3value Tff7b72!Tff7b72= Te6edf3contactKeyTb4b4b4) Tb4b4b4{
Te6edf3contactKeyForPagedMessagesTb4b4b4.Te6edf3value Tff7b72= Te6edf3contactKey
Tb4b4b4}
Tff7b72return Te6edf3flow Tb4b4b4{ Te6edf3emitAllTb4b4b4(Te6edf3packetRepositoryTb4b4b4.Te6edf3getMessagesFromTb4b4b4(Te6edf3contactKeyTb4b4b4, Te6edf3limit Tff7b72= Te6edf3limitTb4b4b4, Te6edf3getNode Tff7b72= Tff7b72::Te6edf3getNodeTb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tff7b72fun Td2a8fftoggleShowQuickChatTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3uiPrefsTb4b4b4.Te6edf3setShowQuickChatTb4b4b4(Tff7b72!Te6edf3uiPrefsTb4b4b4.Te6edf3showQuickChatTb4b4b4.Te6edf3valueTb4b4b4)
Tb4b4b4}
Tff7b72fun Td2a8fftoggleShowFilteredTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3_showFilteredTb4b4b4.Te6edf3update Tb4b4b4{ Tff7b72!Tffa657it Tb4b4b4}
Tb4b4b4}
Tff7b72fun Td2a8ffsetContactFilteringDisabledTb4b4b4(Te6edf3contactKeyTb4b4b4: Tffa657StringTb4b4b4, Te6edf3disabledTb4b4b4: Tffa657BooleanTb4b4b4) Tb4b4b4{
Te6edf3viewModelScopeTb4b4b4.Te6edf3launchTb4b4b4(Te6edf3ioDispatcherTb4b4b4) Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3setContactFilteringDisabledTb4b4b4(Te6edf3contactKeyTb4b4b4, Te6edf3disabledTb4b4b4) Tb4b4b4}
Tb4b4b4}
Tff7b72fun Td2a8ffgetNodeTb4b4b4(Te6edf3userIdTb4b4b4: Tffa657String?Tb4b4b4) Tff7b72= Te6edf3nodeRepositoryTb4b4b4.Te6edf3getNodeTb4b4b4(Te6edf3userId Tff7b72?: Te6edf3DataPacketTb4b4b4.Te6edf3ID_BROADCASTTb4b4b4)
Tff7b72fun Td2a8ffgetUserTb4b4b4(Te6edf3userIdTb4b4b4: Tffa657String?Tb4b4b4) Tff7b72= Te6edf3nodeRepositoryTb4b4b4.Te6edf3getUserTb4b4b4(Te6edf3userId Tff7b72?: Te6edf3DataPacketTb4b4b4.Te6edf3ID_BROADCASTTb4b4b4)
T8b949e/**
* Sends a message to a contact or channel.
*
* If the message is a direct message (no channel specified), this function will:
* - If the device firmware version is older than 2.7.12, it will mark the destination node as a favorite to prevent
* it from being removed from the on-device node database.
* - If the device firmware version is 2.7.12 or newer, it will send a shared contact to the destination node.
*
* @param str The message content.
* @param contactKey The unique contact key, which is a combination of channel (optional) and node ID. Defaults to
* broadcasting on channel 0.
* @param replyId The ID of the message this is a reply to, if any.
*/
Tff7b72fun Td2a8ffsendMessageTb4b4b4(Te6edf3strTb4b4b4: Tffa657StringTb4b4b4, Te6edf3contactKeyTb4b4b4: Tffa657String Tff7b72= Ta5d6ff"Ta5d6ff0Tffd700${Te6edf3DataPacketTb4b4b4.Te6edf3ID_BROADCASTTffd700}Ta5d6ff"Tb4b4b4, Te6edf3replyIdTb4b4b4: Tffa657Int? Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3viewModelScopeTb4b4b4.Te6edf3launch Tb4b4b4{ Te6edf3sendMessageUseCaseTb4b4b4.Te6edf3invokeTb4b4b4(Te6edf3strTb4b4b4, Te6edf3contactKeyTb4b4b4, Te6edf3replyIdTb4b4b4) Tb4b4b4}
Tb4b4b4}
Tff7b72fun Td2a8ffsendReactionTb4b4b4(Te6edf3emojiTb4b4b4: Tffa657StringTb4b4b4, Te6edf3replyIdTb4b4b4: Tffa657IntTb4b4b4, Te6edf3contactKeyTb4b4b4: Tffa657StringTb4b4b4) Tff7b72= Te6edf3viewModelScopeTb4b4b4.Te6edf3launch Tb4b4b4{
Te6edf3serviceRepositoryTb4b4b4.Te6edf3onServiceActionTb4b4b4(Te6edf3ServiceActionTb4b4b4.Te6edf3ReactionTb4b4b4(Te6edf3emojiTb4b4b4, Te6edf3replyIdTb4b4b4, Te6edf3contactKeyTb4b4b4)Tb4b4b4)
Tb4b4b4}
Tff7b72fun Td2a8ffdeleteMessagesTb4b4b4(Te6edf3uuidListTb4b4b4: Te6edf3ListTff7b72<Tffa657LongTff7b72>Tb4b4b4) Tff7b72=
Te6edf3viewModelScopeTb4b4b4.Te6edf3launchTb4b4b4(Te6edf3ioDispatcherTb4b4b4) Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3deleteMessagesTb4b4b4(Te6edf3uuidListTb4b4b4) Tb4b4b4}
Tff7b72fun Td2a8ffclearUnreadCountTb4b4b4(Te6edf3contactTb4b4b4: Tffa657StringTb4b4b4, Te6edf3messageUuidTb4b4b4: Tffa657LongTb4b4b4, Te6edf3lastReadTimestampTb4b4b4: Tffa657LongTb4b4b4) Tff7b72=
Te6edf3viewModelScopeTb4b4b4.Te6edf3launchTb4b4b4(Te6edf3ioDispatcherTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3existingTimestamp Tff7b72= Te6edf3contactSettingsTb4b4b4.Te6edf3valueTff7b72[Te6edf3contactTff7b72]Tff7b72?.Te6edf3lastReadMessageTimestamp Tff7b72?: Tffa657LongTb4b4b4.Te6edf3MIN_VALUE
Tff7b72if Tb4b4b4(Te6edf3lastReadTimestamp Tff7b72<Tff7b72= Te6edf3existingTimestampTb4b4b4) Tb4b4b4{
Tff7b72returnTf0883e@launch
Tb4b4b4}
Te6edf3packetRepositoryTb4b4b4.Te6edf3clearUnreadCountTb4b4b4(Te6edf3contactTb4b4b4, Te6edf3lastReadTimestampTb4b4b4)
Te6edf3packetRepositoryTb4b4b4.Te6edf3updateLastReadMessageTb4b4b4(Te6edf3contactTb4b4b4, Te6edf3messageUuidTb4b4b4, Te6edf3lastReadTimestampTb4b4b4)
Tff7b72val Te6edf3unreadCount Tff7b72= Te6edf3packetRepositoryTb4b4b4.Te6edf3getUnreadCountTb4b4b4(Te6edf3contactTb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3unreadCount Tff7b72=Tff7b72= T79c0ff0Tb4b4b4) Te6edf3notificationManagerTb4b4b4.Te6edf3cancelTb4b4b4(Te6edf3contactTb4b4b4.Te6edf3hashCodeTb4b4b4(Tb4b4b4)Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Served by rngit 1.5.0 - Generated in 0.1s